BackForward
/*----------------------------------------\
| Data step Function to put all variable left aligned, concatenate   |
| the variables if 2 or more variables are give;                     |
|-------------------------------------------|
|--------------------------------------------------------------------|
|---------------------------|
| Arguments:                                                         |
|   charvar  - keyword or positional parameter;                      |
|              character variables (if more than 1 variables,        |
|              separated by space;                                   |
|   numvar   - keyword or positional parameter;                      |
|              numeric variables (if more than 1 variables, separated|
|              by space;                                             |
|--------------------------------|
|--------------------------------------------------------------------|
|---------------------------------------|
| Example:                                                           |
|  %put %trimd(pt, atafid vtvfid);                                   |
|  %trimd(charvar=, numvar=) / %trimd(charvar, numvar);              |
| Usgae: trimd/parmbuff;                                             |
\----------------------------------------*/
%macro trimd/parmbuff;
/*--------------------------------------------\
| Copy Right: Duo Zhou;                       |
| Created:  11-01-2002 11:54pm;               |
| Purpose:  trim(left(sting))                 |
\--------------------------------------------*/
%let _trimdstr_=%sysfunc(translate(%quote(%substr(%quote(%trim(%quote(%left(%quote(&syspbuff))))), 2, %eval(%length(%trim(%quote(%left(%quote(&syspbuff)))))-2))), %str(%'), %str(%")));
%let _trimdwn_=0; %let charvar=; %let numvar=;
%do %while(%length(%nrbquote(%scan(%nrbquote(&_trimdstr_), %eval(&_trimdwn_+1), %nrbquote(,())))));
   %let _trimdwn_=%eval(&_trimdwn_+1);
   %let _trimdparam_=%nrbquote(%qscan(%nrbquote(&_trimdstr_), &_trimdwn_, %nrbquote(,())));
   %let _trimdparam1_=%trim(%left(%qscan(%nrbquote(&_trimdparam_), 1, %str(=))));
   %let _trimdparam2_=%substr(%quote(&_trimdparam_), %eval(%index(%quote(&_trimdparam_),%str(=))+1), %eval(%length(&_trimdparam_)-%index(%quote(&_trimdparam_),%str(=))));
   %if (not %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_trimdparam_))))), %str(=))) %then %do;
      %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_trimdparam2_))))), %str(%()) eq 1) and
          (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&_trimdparam2_))))))), %str(%))) eq 1) %then
         %let _trimdparam2_=%substr(%quote(%trim(%quote(%left(%quote(&_trimdparam2_))))), 2, %eval(%length(%trim(%quote(%left(%quote(&_trimdparam2_)))))-2));
      %if (%quote(&_trimdwn_) = %quote(1)) %then %let charvar=&_trimdparam2_; 
      %else %if (%quote(&_trimdwn_) = %quote(2)) %then %let numvar=&_trimdparam2_;
   %end;
   %else %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_trimdparam2_))))), %str(%()) eq 1) and
          (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&_trimdparam2_))))))), %str(%))) eq 1) %then 
      %let &_trimdparam1_=%substr(%quote(%trim(%quote(%left(%quote(&_trimdparam2_))))), 2, %eval(%length(%trim(%quote(%left(%quote(&_trimdparam2_)))))-2));
   %else %let &_trimdparam1_=&_trimdparam2_; 
%end;
%let _trimdoutstr_=;
%let _trimdcharvn_=0; 
%do %while(%length(%nrbquote(%scan(%nrbquote(&charvar), %eval(&_trimdcharvn_+1), %nrbquote( )))));
   %let _trimdcharvn_=%eval(&_trimdcharvn_+1);
   %if &_trimdcharvn_ = 1 %then %let _trimdoutstr_=trimn(left(%nrbquote(%qscan(%nrbquote(&charvar), &_trimdcharvn_, %nrbquote( )))));
   %else %let _trimdoutstr_=&_trimdoutstr_||'_'||trimn(left(%nrbquote(%qscan(%nrbquote(&charvar), &_trimdcharvn_, %nrbquote( )))));
%end;
%let _trimdnumvn_=0; 
%do %while(%length(%nrbquote(%scan(%nrbquote(&numvar), %eval(&_trimdnumvn_+1), %nrbquote( )))));
   %let _trimdnumvn_=%eval(&_trimdnumvn_+1);
   %if (&_trimdnumvn_ = 1 and &_trimdcharvn_=0) %then %let _trimdoutstr_=trimn(left(put(%nrbquote(%qscan(%nrbquote(&numvar), &_trimdnumvn_, %nrbquote( ))), best12.)));
   %else %let _trimdoutstr_=&_trimdoutstr_||'_'||trimn(left(put(%nrbquote(%qscan(%nrbquote(&numvar), &_trimdnumvn_, %nrbquote( ))), best12.)));
%end;&_trimdoutstr_
%mend trimd;